/**
 * phi
 */

// ----------------------------------------------------------------
// 定数
// ----------------------------------------------------------------
var DEFAULT_MODEL_NAME = "model/marukichi.mqo";

// ----------------------------------------------------------------
// グローバル変数
// ----------------------------------------------------------------
var light   = null;
var camera  = null;
var floor   = null;
var target  = null;

// おまじない
enchant();
            

// dat-gui をロード
TM.addNamespace("dat-gui", "lib/dat-gui");
TM.loadDatGUI();


TM.main(function() {
    
    initGame();
    //setTimeout(initDatGUI, 1000);
    
});

/**
 * 
 */
var initGame = function()
{
    //var game = new Game(640, 640);
    var game = new Game(window.innerWidth, window.innerHeight);
    game.fps = 60;
    game.keybind(90, 'a');      // z
    game.keybind(88, 'b');      // x
    game.keybind(32, "space");  // space
    
    game.onload = function() {
        var scene = new Scene3D();
        scene.backgroundColor = [ 0.2, 0.2, 0.2, 1.0 ];
        
        // ライト生成
        light = new DirectionalLight();     // 平行光源生成
        light.directionX = 1;               // 向き
        light.directionY = 1;               // 向き
        light.directionZ = 0.1;             // 向き
        light.color = [1.0, 1.0, 1.0];      // 色
        scene.setDirectionalLight(light);   // scene にセット
        
        // カメラ生成
        camera = new DebugCamera3D();       // カメラ生生
        camera.distance = 12;               // 距離
        camera.enable(game.rootScene);      // ルートシーン
        scene.setCamera(camera);            // scene にセット
        
        // 床生成
        floor = new Floor(10, 10, 17, 17, "white", "white");
        floor.x = floor.y = floor.z = 0;
        floor.primType = gl.LINES;
        scene.addChild(floor);
        
        // 軸
        var axis = new Axis();
        axis.primType = gl.LINES;
        axis.scale(6, 6, 6);
        scene.addChild(axis);
        
        // ターゲットを生成
        /*
        target = new Billboard();
        target.mesh.setBaseColor([1.0, 1.0, 1.0, 1.0]);
        target.mesh.texture = new Texture("texture/particle.png");
        target.mesh.texture.diffuse = [0.0, 0.0, 0.0, 1.0];
        target.mesh.texture.shininess = 100;
        scene.addChild(target);             // scene にセット
        */
        
        var plane = new FireEffect();
        scene.addChild(plane);
        
        /*
        target = new Sprite3D();        // 球体生成
        target.x = target.y = target.z = 0; // 位置をセット
        target.set(game.assets[DEFAULT_MODEL_NAME]);
        scene.addChild(target);             // scene にセット
        */
        
        // ドラッグ & ドロップまわりを初期
        initDragAndDrop();
        
        // gui 初期化
        initDatGUI();
    };
    
    game.start();
};


var initDatGUI = function()
{
    var game = enchant.Game.instance;
    var scene= game.currentScene3D;
    
    if (window["dat"]) {
        var gui = new dat.GUI();
        
        
        // ----------------------------------------------------------------
        // ファイル
        var openFuncs = {
            marukichi: function() { onOpenNewModelFile("model/marukichi.mqo"); },
            inoshishi: function() { onOpenNewModelFile("model/inoshishi.mqo"); },
            meka: function() { onOpenNewModelFile("model/meka.mqo"); },
            tank: function() { onOpenNewModelFile("model/tank.mqo"); },
            planet: function() { onOpenNewModelFile("model/planet.mqo"); },
        };
        var fileFolder = gui.addFolder("File");
        fileFolder.add(window, "openModelFile");
        fileFolder.add(openFuncs, "marukichi");
        fileFolder.add(openFuncs, "inoshishi");
        fileFolder.add(openFuncs, "meka");
        fileFolder.add(openFuncs, "tank");
        fileFolder.add(openFuncs, "planet");
        
        
        // ----------------------------------------------------------------
        // 環境設定
        var envObject = {
            "background": [0, 0, 0, 1.0],
            "grid"      : [255, 255, 255, 1.0],
        };
        var envFolder = gui.addFolder("Environment");
        envFolder.addColor(envObject, "background").onChange(function(value){
            scene.backgroundColor = [ value[0] / 255, value[1] / 255, value[2] / 255, 1.0 ];
        });
        envFolder.addColor(envObject, "grid").onChange(function(value){
            floor.mesh.setBaseColor([ value[0] / 255, value[1] / 255, value[2] / 255, 1.0 ]);
        });
        // ----------------------------------------------------------------
        // ライト
        var lightFolder = envFolder.addFolder('Light');
        lightFolder.add(light, "directionX", -1, 1, 0.1);
        lightFolder.add(light, "directionY", -1, 1, 0.1);
        lightFolder.add(light, "directionZ", -1, 1, 0.1);
        
        
        
        // ----------------------------------------------------------------
        // カメラパラメータ
        var cameraFolder = gui.addFolder('Camera');
        cameraFolder.add(camera, "distance", -50, 50, 0.1);
        cameraFolder.add(camera, "theta", -90, 90, 0.1);
        cameraFolder.add(camera, "phi", -180, 180, 0.1);
        cameraFolder.open();
        
    }
};



var initDragAndDrop = function()
{
    var game = enchant.Game.instance;
    var scene= game.currentScene3D;
    
    document.ondragover  = function() { return false; };
    document.ondragenter = function() { return false; };
    document.ondrop = function(e) {
        e.preventDefault();
        var file    = e.dataTransfer.files[0];
        var reader  = new FileReader();
        var ext     = file.fileName.match(/\.\w+$/)[0];
        if (ext) ext = ext.slice(1).toLowerCase();
        var imageExt = { "png": true, "jpg": true, "bmp": true };
        
        if (ext == "mqo") {
            // 現在のモデルを破棄して新たなモデルを追加
            reader.onload = function(e) {
                enchant.gl.Sprite3D.loadMqoFromData(e.target.result, function(model) {
                    scene.removeChild(target);
                    scene.addChild(model);
                    target = model;
                });
            };
            
            reader.readAsText(file);
        }
        else if (imageExt[ext] === true) {
            // 現在のモデルにテクスチャを貼り付ける
            reader.onload = function(e) {
                var image = new Image();
                image.src = e.target.result;
                image.onload = function() {
                    var texture = new Texture(image);
                    for (var i=0,len=target.childNodes.length; i<len; ++i) {
                        var childNodeMesh = target.childNodes[i].mesh;
                        childNodeMesh.texture = texture;
                    }
                }
            };
            
            reader.readAsDataURL(file);
        }
    };
};



var openModelFile = function()
{
    var eFile   = document.getElementById("file")
    var evt     = document.createEvent("MouseEvents");
    
    evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, 0);
    eFile.dispatchEvent(evt);
};

var onOpenNewModelFile = function(filename)
{
    var game = enchant.Game.instance;
    var scene= game.currentScene3D;
    
    enchant.gl.Sprite3D.loadMqo(filename, function(model) {
        scene.removeChild(target);
        scene.addChild(model);
        target = model;
    });
};



var Axis = Class.create(Sprite3D, {
    
    initialize: function() {
        Sprite3D.call(this);
        
        this.mesh.vertices = [
            0, 0, 0,
            1, 0, 0,
            0, 0, 0,
            0, 1, 0,
            0, 0, 0,
            0, 0, 1,
        ];
        
        this.mesh.colors = [
            1.0, 0.0, 0.0, 1.0,
            1.0, 0.0, 0.0, 1.0,
            0.0, 1.0, 0.0, 1.0,
            0.0, 1.0, 0.0, 1.0,
            0.0, 0.0, 1.0, 1.0,
            0.0, 0.0, 1.0, 1.0,
        ];
        
        this.mesh.normals = [
            1.0, 0.0, 0.0,
            1.0, 0.0, 0.0,
            1.0, 0.0, 0.0,
            1.0, 0.0, 0.0,
            1.0, 0.0, 0.0,
            1.0, 0.0, 0.0,
        ];
        
        this.mesh.texCoords = [
            0, 0,
            0, 0,
            0, 0,
            0, 0,
            0, 0,
            0, 0,
        ];
        
        this.mesh.indices = [
            0, 1,
            2, 3,
            4, 5,
        ];
        
    }
    
});

